﻿//====================================================================================================================
//Copyright (c) 2011 IdeaBlade
//====================================================================================================================
//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
//documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
//the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, 
//and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//====================================================================================================================
//The above copyright notice and this permission notice shall be included in all copies or substantial portions of 
//the Software.
//====================================================================================================================
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
//WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 
//OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
//OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
//====================================================================================================================

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using IdeaBlade.Application.Framework.Core.Persistence;
using IdeaBlade.EntityModel;

namespace HelloWorld.Repository
{
    [Export(typeof(IOrderManagementRepository))]
    public class OrderManagementRepository : IOrderManagementRepository
    {
        private readonly IEntityManagerProvider<NorthwindIBEntities> _entityManagerProvider;

        // Ensure that each repository instance receives a new instance of the EntityManagerProvider.
        // This is the basic step to create a sandbox environment for each repository.
        [ImportingConstructor]
        public OrderManagementRepository(
            [Import(RequiredCreationPolicy = CreationPolicy.NonShared)] IEntityManagerProvider<NorthwindIBEntities>
                entityManagerProvider)
        {
            _entityManagerProvider = entityManagerProvider;
        }

        private NorthwindIBEntities Manager
        {
            get { return _entityManagerProvider.Manager; }
        }

        #region IOrderManagementRepository Members

        public INotifyCompleted GetCustomers(Action<IEnumerable<Customer>> onSuccess = null,
                                             Action<Exception> onFail = null)
        {
            var query = Manager.Customers.Include("Orders").Include("Orders.Employee");
            var op = query.ExecuteAsync();
            return op.OnComplete(onSuccess, onFail);
        }

        public INotifyCompleted Save(Action onSuccess = null, Action<Exception> onFail = null)
        {
            EntitySaveOperation op = Manager.SaveChangesAsync();
            return op.OnComplete(onSuccess, onFail);
        }

        public Order ImportOrder(Order order)
        {
            Manager.ImportEntities(new[] { order }, MergeStrategy.OverwriteChanges);
            return (Order)Manager.FindEntity(order.EntityAspect.EntityKey);
        }

        #endregion
    }
}